#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author:zhengxin
@file: 011_Pandas_Data_Visualization.py
@time: 2025/2/17  15:26
# @describe: Pandas 数据可视化
"""

""" 
数据可视化是数据分析中的重要环节，它帮助我们更好地理解和解释数据的模式、趋势和关系。
通过图形、图表等形式，数据可视化将复杂的数字和统计信息转化为易于理解的图像，从而便于做出决策。
Pandas 提供了与 Matplotlib 和 Seaborn 等可视化库的集成，使得数据的可视化变得简单而高效。
在 Pandas 中，数据可视化功能主要通过 DataFrame.plot() 和 Series.plot() 方法实现，这些方法实际上是对 Matplotlib 库的封装，简化了图表的绘制过程。

"""

"""
一、Pandas 数据可视化概述
    Pandas 提供的 plot() 方法可以轻松地绘制不同类型的图表，包括折线图、柱状图、直方图、散点图等。plot() 方法有很多参数，可以定制图表的样式、颜色、标签等。
    
    1. 基本的 plot() 方法
    参数	        说明
    kind	    图表类型，支持 'line', 'bar', 'barh', 'hist', 'box', 'kde', 'density', 'area', 'pie' 等类型
    x	        设置 x 轴的数据列
    y	        设置 y 轴的数据列
    title	    图表的标题
    xlabel	    x 轴的标签
    ylabel	    y 轴的标签
    color	    设置图表的颜色
    figsize	    设置图表的大小（宽, 高）
    legend	    是否显示图例
    
    
    2. 常用图表类型
图表类型	       描述	                                            常用用法
折线图	        用于显示随时间变化的数据趋势	                    df.plot(kind='line')
柱状图	        用于显示类别之间的比较数据	                    df.plot(kind='bar')
水平柱状图	    与柱状图类似，但柱子是水平的	                    df.plot(kind='barh')
直方图	        用于显示数据的分布（频率分布）	                df.plot(kind='hist')
散点图	        用于显示两个数值变量之间的关系	                df.plot(kind='scatter', x='col1', y='col2')
箱线图	        用于显示数据的分布、异常值及四分位数	            df.plot(kind='box')
密度图	        用于显示数据的密度分布	                        df.plot(kind='kde')
饼图	            用于显示各部分占总体的比例	                    df.plot(kind='pie')
区域图	        用于显示累计数值的图表（类似于折线图，但填充了颜色）	df.plot(kind='area')
"""

""" 1. 折线图 (Line Plot) """
import pandas as pd
import matplotlib.pyplot as plt

data = {
    "Year": [2015, 2016, 2017, 2018, 2019, 2020],
    "Sales": [100, 150, 200, 250, 300, 350]
}
df = pd.DataFrame(data)

# 绘制折线图
df.plot(kind="line", x="Year", y="Sales", title="Sales Over Years", xlabel="Year", ylabel="Sales", figsize=(10, 6))
plt.show()


""" 2. 柱状图 (Bar Chart) """
import pandas as pd
import matplotlib.pyplot as plt

data = {'Category': ['A', 'B', 'C', 'D'],
        'Value': [10, 15, 7, 12]}
df = pd.DataFrame(data)

# 绘制柱状图
df.plot(kind="bar", x="Category", y="Value", title="Category Value", xlabel="Category", ylabel="Value", figsize=(8, 5))
plt.show()


""" 3. 散点图 (Scatter Plot)  """
import pandas as pd
import matplotlib.pyplot as plt

data = {'Height': [150, 160, 170, 180, 190],
        'Weight': [50, 60, 70, 80, 90]}
df = pd.DataFrame(data)

# 绘制散点图
df.plot(kind="scatter", x="Height", y="Weight", title="Height vs Weight", xlabel="Height(cm)", ylabel="Weight(kg)", figsize=(8, 5))
plt.show()


""" 4. 直方图 (Histogram) """
import pandas as pd
import matplotlib.pyplot as plt

data = {'Scores': [55, 70, 85, 90, 60, 75, 80, 95, 100, 65]}
df = pd.DataFrame(data)

# 绘制直方图
df.plot(kind="hist", y="Scores", bins=5, title='Scores Distribution', xlabel='Scores', figsize=(8, 5))
plt.show()


""" 5. 箱线图 (Box Plot) """
import pandas as pd
import matplotlib.pyplot as plt

data = {'Scores': [55, 70, 85, 90, 60, 75, 80, 95, 100, 65]}
df = pd.DataFrame(data)

# 绘制箱线图
df.plot(kind="box", title='Scores Boxplot', ylabel='Scores', figsize=(8, 5))
plt.show()


""" 6. 饼图 (Pie Chart)  """
import pandas as pd
import matplotlib.pyplot as plt

data = {'Category': ['A', 'B', 'C', 'D'],
        'Value': [10, 15, 7, 12]}
df = pd.DataFrame(data)

# 绘制饼图
df.plot(kind="pie", y="Value", labels=df["Category"], autopct="%1.1f%%", title="Category Proportions", figsize=(8, 5))
plt.show()



""" 三、Seaborn 可视化 """
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]}
df = pd.DataFrame(data)

# 绘制热力图
sns.heatmap(df.corr(), annot=True, cmap="coolwarm")
plt.show()




""" 数据集中所有数值特征之间的散点图矩阵: """
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

data = {"A": [1, 2, 3], "B": [4, 5, 6], "C": [7, 8, 9]}
df = pd.DataFrame(data)

sns.pairplot(df)
plt.show()



""" 
    四、Matplotlib 高级自定义
除了使用 Pandas 提供的 plot() 方法外，Matplotlib 还可以提供更灵活的自定义功能，例如添加标题、标签、设置图表风格、调整坐标轴等。 
"""
import pandas as pd
import matplotlib.pyplot as plt

data = {'Year': [2015, 2016, 2017, 2018, 2019],
        'Sales': [100, 150, 200, 250, 300]}
df = pd.DataFrame(data)

# 绘制折线图
plt.plot(df["Year"], df["Sales"], color="blue", marker='o')

# 自定义
plt.title("Sales Over Years")
plt.xlabel("Year")
plt.ylabel("Sales")
plt.grid(True)

plt.show()